package com.jiantong.user.impl.dao;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.jiantong.user.model.User;
import io.terminus.common.model.Paging;
import io.terminus.common.mysql.dao.MyBatisDao;
import io.terminus.common.utils.Arguments;
import org.springframework.stereotype.Repository;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@Repository
public class UserDao extends MyBatisDao<User> {

    /**
     * 根据名称查找用户
     *
     * @param name  名称
     * @return  对应的用户
     */
    public User findByName(String name){
        return getSqlSession().selectOne(sqlId("findByName"),name);
    }

    /**
     * 以邮箱查找用户
     * @param email 用户名
     * @return 用户
     */
    public User findByEmail(String email){
        return getSqlSession().selectOne(sqlId("findByEmail"),  email);
    }

    /**
     * 以手机号查找用户
     * @param mobile 用户名
     * @return 用户
     */
    public User findByMobile(String mobile){
        return getSqlSession().selectOne(sqlId("findByMobile"),  mobile);
    }

    /**
     * 根据userId查询用户
     *
     * @param userId
     * @return user
     */
    public User findUserByUserId(Long userId){
        return getSqlSession().selectOne(sqlId("findUserByUserId"),userId);
    }

    /**
     * 更新用户状态
     * @param userId 用户id
     * @param status 用户状态
     * @return 更新记录数
     */
    public Integer updateStatus(Long userId, Integer status) {
        return getSqlSession().update(sqlId("updateStatus"),
                ImmutableMap.of("id", userId, "status", status));
    }

    /**
     * 批量更新用户状态
     * @param userIds 用户id列表
     * @param status 用户状态
     * @return 更新记录数
     */
    public Integer batchUpdateStatus(List<Long> userIds, Integer status) {
        return getSqlSession().update(sqlId("batchUpdateStatus"),
                ImmutableMap.of("ids", userIds, "status", status));
    }

    /**
     * 更新用户类型
     * @param userId 用户id
     * @param type 用户类型
     */
    public Integer updateType(Long userId, int type) {
        return getSqlSession().update(sqlId("updateType"), ImmutableMap.of("userId", userId, "type", type));
    }

    /**
     * 根据名字模糊查询一租id
     *
     * @param name
     * @return ids
     */
    public  List<User> findIdsByName(String name){
       return getSqlSession().selectList(sqlId("findIdsByName"),name);
    }

    /**
     * 根据一组ID查询一组user
     * findUserByIds
     */
    public List<User> findUserByIds(List<Long> ids) {
        return Arguments.isEmpty(ids)? Collections.emptyList():this.sqlSession.selectList(this.sqlId("findUserByIds"), ids);
    }


    public Paging<User> pagingFindBykeyword(Integer offset, Integer limit, Map<String, Object> criteria) {
        if(criteria == null) {
            criteria = Maps.newHashMap();
        }

        Long total = (Long)this.sqlSession.selectOne(this.sqlId("bykeywordCount"), criteria);
        if(total.longValue() <= 0L) {
            //如果发现关匹配关键字的结果长度是0 那么返回一个空的list()
            return new Paging(Long.valueOf(0L), Collections.emptyList());
        } else {
            criteria.put("offset", offset);
            criteria.put("limit", limit);
            List datas = this.sqlSession.selectList(this.sqlId("pagingFindBykeyword"), criteria);
            return new Paging(total, datas);
        }
    }

    public List<User> selectAllUser(Map cirteria){

        return getSqlSession().selectList(sqlId("allUser"),cirteria);
    }

    public List<Long> selectIds(Map criteria){
        return getSqlSession().selectList(sqlId("selectUserIds"),criteria);
    }

}
